#include "FSM.h"

FSM::FSM()
{
	estado_inicial = NULL;
	estado_actual = NULL;
}

FSM::~FSM()
{
	if(estado_actual)
		estado_actual->Salir();
		
	forall(it,estados)
		delete it->second;
}

/* Hace falta? Con CambiarAEstado no alcanza? */
void FSM::Iniciar()
{
	if(!estado_inicial) Error("El estado inicial de la FSM es nulo. Definir un estado inicial.");
	estado_actual = estado_inicial;
	estado_actual->Entrar();
}

void FSM::Parar()
{
	estado_actual->Salir();
	estado_actual = NULL;
}

void FSM::DefinirEstadoInicial(const char* nombre_de_estado)
{
	if(!exists(nombre_de_estado,estados))
		Error("No existe un estado con este nombre");

	estado_inicial = estados[nombre_de_estado];
}

void FSM::AgregarEstado(const char* nombre_de_estado, Estado* estado)
{
	estados[nombre_de_estado] = estado;
}

void FSM::CambiarAEstado(const char* nombre_de_estado)
{
	if(estado_actual)
		estado_actual->Salir();

	if(!exists(nombre_de_estado,estados))
		Error("No existe un estado con este nombre");
	
	estado_actual = estados[nombre_de_estado];
	
	estado_actual->Entrar();
}
